package main

import (
	"net"
	"strings"
	"fmt"
)

type User struct {
	Name   string
	Addr   string
	Ch     chan string
	conn   net.Conn
	server *Server
}

// 监听用户通道
func (u *User) Listen() {
	for {
		lis := <-u.Ch
		u.conn.Write([]byte(lis))
	}
}

// 用户上线
func (u *User) Online() {
	u.server.mapLock.Lock() //上锁
	u.server.Online[u.Name] = u
	u.server.mapLock.Unlock() //解锁
	//广播用户上线消息
	u.server.Broadcast(u, "已上线")
}

// 用户下线
func (u *User) Offline() {
	u.server.mapLock.Lock() //上锁
	delete(u.server.Online, u.Name)
	u.server.mapLock.Unlock() //解锁
	//广播用户上线消息
	u.server.Broadcast(u, "下线")
}

// 给对应的user发送消息
func (u *User) Senduser(msg string) {
	u.conn.Write([]byte(msg))
}

// 用户处理消息
func (u *User) Domsg(msg string) {
	parts := strings.SplitN(msg, "|",3)
	if len(parts) < 1  || parts[0] == "" {
		u.Senduser("消息格式错误，请重试\r\n")
		return
	}
	switch parts[0] {
	case "<公聊>":
		if len(parts) < 2 {
			u.Senduser("消息为空，请重试\r\n")
			return
		}
		tomsg := strings.Join(parts[1:], "|")
		u.server.Broadcast(u, tomsg)
	case "<私聊>":
		if len(parts) < 3 {
			u.Senduser("发送格式错误\r\n")
			return
		}
		name := parts[1]
		if name == "" {
			u.Senduser("发送格式错误\r\n")
			return
		}
		touser, ok := u.server.Online[name]
		if !ok {
			u.Senduser("用户不存在\r\n")
			return
		}
		tomsg := strings.Join(parts[2:], "|")
		if tomsg == "" {
			u.Senduser("消息为空，请重复\r\n")
			return
		}
		// 转义处理（示例）
		tomsg = strings.ReplaceAll(tomsg, "\r", "")
		tomsg = strings.ReplaceAll(tomsg, "\n", "")
		touser.Senduser(fmt.Sprintf("(%s)给你发消息：%s\r\n", u.Name, tomsg))
		u.Senduser("消息已发送\r\n")
	case "<改名>":
		if len(parts) < 2 {
			u.Senduser("发送格式错误\r\n")
			return
		}
		if len(parts) > 2 {
			u.Senduser("名字不能含有符号“|”\r\n")
			return
		}
		newName := strings.Join(parts[1:], "|")
		if newName == "" {
			u.Senduser("用户名不能为空\r\n")
			return
		}
		_, ok := u.server.Online[newName]
		if ok {
			u.Senduser("用户名重复，请重试！\r\n")
		} else {
			u.server.mapLock.Lock()
			delete(u.server.Online, u.Name)
			u.server.Online[newName] = u
			u.server.mapLock.Unlock()
			u.Name = newName
			u.Senduser(fmt.Sprintf("您的用户名已更新为[%s]\r\n", newName))
		}
	case "<在线列表>":
		var listMsgs []string
		u.server.mapLock.Lock()
		for _, user := range u.server.Online {
			if user == u {
				listMsgs = append(listMsgs, fmt.Sprintf("<本人>[%s](%s)[在线...]\r\n", user.Addr, user.Name))
			} else {
				listMsgs = append(listMsgs, fmt.Sprintf("[%s](%s)[在线...]\r\n", user.Addr, user.Name))
			}
		}
		u.server.mapLock.Unlock()

		for _, msg := range listMsgs {
			u.Senduser(msg)
		}
	}
}

// 创建一个用户
func NewUser(conn net.Conn, s *Server) *User {
	userAddr := conn.RemoteAddr().String()
	usr := &User{userAddr, userAddr, make(chan string), conn, s}
	go usr.Listen()
	return usr
}
